//
//  FGNetworkManager.swift
//  飞哥大微博
//
//  Created by huangfei on 2017/6/6.
//  Copyright © 2017年 huangfei. All rights reserved.
//

import UIKit
import AFNetworking

// Swift 的枚举类型支持任意数据类型
enum FGHTTPMethod {
    case GET
    case POST
}

// 网路管理工具
class FGNetworkManager: AFHTTPSessionManager {

    // 静态区/常量/闭包
    // 在第一次访问时，执行闭包，并且将结果保存在 shared 常量中
    static let shared : FGNetworkManager = {
        // 实例化对象
        let instance = FGNetworkManager()
        
        // 设置响应反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        // 返回对象
        return instance
    }()
    
//    // 访问令牌，所有网络请求，都基于此令牌（登录除外）
//    var accessToken : String? //= "2.00YDhzOE2W4a1D9a0dd9514eBaHdsD"
//    // 用户微博 id
//    var uid:String? = "3886103552"
    
    /// 用户账户的懒加载属性
    lazy var userAccount = FGUserAccount()
    
    // 用户登录标记(计算型属性)
    var userLogon:Bool {
        return userAccount.access_token != nil
    }
    
    // 专门负责拼接 token 的网络请求方法
    func tokenRequest(method:FGHTTPMethod = .GET,URLString: String,parameters: [String:Any]?,completion:@escaping (_ json:Any?,_ isSuccess:Bool)->()) {
        // 处理 token 字典
        // 0>判断token是否为nil，为nil直接返回
        guard let token = userAccount.access_token else {
            print("没有token！需要登录")
            // 发送通知,提示用户登录
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: FGUserShouldLoginNotification), object: nil)
            
            completion(nil,false)
            return
        }
        // 1>判断参数字典是否存在，如果为nil，应该新建一个字典
        var parameters = parameters
        if parameters == nil {
            // 实例化字典
            parameters = [String:Any]()
        }
        // 2>设置参数字典，代码在此处，字典一定有值
        parameters!["access_token"] = token
        
        // 调用 request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    /// 使用一个函数封装 AFN 的 GET / POST 请求
    ///
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典/数组)，是否成功]
    func request(method:FGHTTPMethod = .GET,URLString: String,parameters: [String:Any]?,completion:@escaping (_ json:Any?,_ isSuccess:Bool)->()) {
        
        // 成功回调
        let success = { (task:URLSessionDataTask, json:Any)->() in
            completion(json, true)
        }
        // 失败回调
        let failure = { (task:URLSessionDataTask?, error:Error)->() in
            // 针对状态码403处理用户token过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("Token过期了")
                // 发送通知,提示用户再次登录（本方法不知道被谁调用，谁接收到通知，谁处理!）
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: FGUserShouldLoginNotification), object: "bad token")
            }
            print("网络请求错误 \(error)")
            completion(nil,false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
